package com.game.common.utils.uuid;

import java.util.Base64;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.security.MessageDigest;

/**
 * ID生成器工具类
 * 
 * @author ruoyi
 */
public class IdUtils
{
    /**
     * 获取随机UUID
     * 
     * @return 随机UUID
     */
    public static String randomUUID()
    {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     * 
     * @return 简化的UUID，去掉了横线
     */
    public static String simpleUUID()
    {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     * 
     * @return 随机UUID
     */
    public static String fastUUID()
    {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     * 
     * @return 简化的UUID，去掉了横线
     */
    public static String fastSimpleUUID()
    {
        return UUID.fastUUID().toString(true);
    }

    /**
     * 生成短UUID
     * 使用13位时间戳和3位随机数生成16位唯一ID
     * @return 16位字符的UUID
     */
    public static String generateShortUUID() {
        try {
            // 获取当前时间戳（毫秒）
            long timestamp = System.currentTimeMillis();
            // 使用13位时间戳
            String timeStr = String.format("%013d", timestamp);
            
            // 生成3位随机字符（包含大小写字母和数字）
            String randomChars = generateRandomChars(3);
            
            // 组合时间戳和随机数
            String combined = timeStr + randomChars;
            
            // 使用Base64编码并移除特殊字符
            String base64 = Base64.getEncoder().encodeToString(combined.getBytes())
                    .replaceAll("[+/=]", "");
            
            // 取前16位
            return base64.substring(0, Math.min(16, base64.length()));
        } catch (Exception e) {
            // 如果发生异常，使用备用方案
            return generateFallbackUUID();
        }
    }

    /**
     * 生成备用UUID（当主方案失败时使用）
     * @return 16位字符的UUID
     */
    private static String generateFallbackUUID() {
        try {
            // 使用纳秒时间戳和随机数
            long nanoTime = System.nanoTime();
            String randomChars = generateRandomChars(3);
            String combined = String.format("%013d", nanoTime % 1000000000000L) + randomChars;
            
            // 使用Base64编码并移除特殊字符
            String base64 = Base64.getEncoder().encodeToString(combined.getBytes())
                    .replaceAll("[+/=]", "");
            
            return base64.substring(0, Math.min(16, base64.length()));
        } catch (Exception e) {
            // 如果还是失败，使用UUID并截取
            return UUID.randomUUID().toString().replace("-", "").substring(0, 16);
        }
    }

    /**
     * 生成指定长度的随机字符（包含大小写字母和数字）
     * @param length 字符串长度
     * @return 随机字符字符串
     */
    private static String generateRandomChars(int length) {
        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int index = (int) (Math.random() * chars.length());
            sb.append(chars.charAt(index));
        }
        return sb.toString();
    }
}
